package com.xyz;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Character {
    // 定义类中的数据 filed 字段
    // 角色名
    private String name;
    // 角色生命
    private int hp;
    // 角色普通攻击
    private int ap;
    // 添加速度字段
    private int sp;

    public HashMap<String, Skill> getSkills() {
        return skills;
    }

    public void setSkills(HashMap<String, Skill> skills) {
        this.skills = skills;
    }

    // 为角色添加技能映射集合字段
    // 每个技能可以有一个 key ，是技能名称，唯一对应一个技能
    private HashMap<String,Skill> skills;
    // 为角色增加当前位置
    private int x;
    private int y;

    public void setHp(int hp) {
        this.hp = hp;
    }

    public void setAp(int ap) {
        this.ap = ap;
    }

    public void setSp(int sp) {
        this.sp = sp;
    }

    // 创建取值器和赋值器
    // 对ap、hp采取赋值保护，去除赋值器
    // 只能通过限定的方法进行更改
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHp() {
        return hp;
    }

    public int getAp() {
        return ap;
    }

    public int getSp() {
        return sp;
    }



    //定义全参数构造方法
    // alt+insert --》Construct -->选中要用的参数
    public Character(String name, int hp, int ap,int sp) {
        this.name = name;
        this.hp = hp;
        this.ap = ap;
        this.sp = sp;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }


    //将对象信息全部输出到一个字符串中
    @Override
    public String toString() {
        return "Character{" +
                "name='" + name + '\'' +
                ", hp=" + hp +
                ", ap=" + ap +
                '}';
    }

    // 实用方法
    public void print(){
        System.out.println("当前角色:"+this.name+"的生命为:"+this.hp+"，攻击力为："+this.ap+
                ",位置（x="+this.x+",y="+this.y+"), sp="+this.sp);
    }

    // 攻击
    public void attack(Character enemy)
    {
        System.out.println(this.name+"攻击"+enemy.name+",打掉其"+this.ap+"点血");
        enemy.hp-=this.ap;
        System.out.println(enemy.name+"当前血量："+enemy.hp);
    }

    // 掉血的方法
    public void loseHp(int a){
        if(a>=0) {
            this.hp -= a;
        }
    }

    // 技能攻击方法
    // 攻击时，通过技能对应的 key ，来找到技能进行攻击
    public void skillAttackOne(Character enemy,String skillKey){
        try {
            Skill sk = this.skills.get(skillKey);
            //当前是单体攻击方法，不能传进来群攻技能，否则提示用户出错
            if(sk.getAttackType()=="s")
            {
                System.out.println(this.name + "使用技能攻击：");
                sk.attack(enemy);
            }
            else {
                System.out.println(this.name + "不是单攻，请选择正确的技能");
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    // 群体技能攻击所有敌人方法
    // 攻击时，通过技能对应的 key ，来找到技能进行攻击
    public void skillAttackAll(ArrayList<? extends Character> enemies,String skillKey){
        try {
            // 从 Hashmap 中根据key取出我们需要的技能
            Skill sk = this.skills.get(skillKey);
            //当前是群体攻击方法，不能传进来单攻技能，否则提示用户出错
            if(sk.getAttackType()=="m")
            {
                System.out.println(this.name + "使用技能攻击：");
                sk.attackAll(enemies);
            }
            else {
                System.out.println(this.name + "不是群攻，请选择正确的技能");
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }


}
